LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

3D-Reconstruction

2022/10/22

三维重建

最近有个任务要进行三维重建,尝试一下


Colmap

colmap是一个可以很方便进行三维重建的开源项目。

安装

官方链接:https://colmap.github.io/install.html

官方编译命令是make -j,我16G电脑内存,8G虚拟机

编译到95%时会报错fatal error: Killed signal terminated program cc1plus,虚拟机内存不足

我重开虚拟机后重新进入build文件夹中,用make编译成功了


使用

下载数据集:https://colmap.github.io/datasets.html

我下载的是gerrard-hall数据集


运行图形化界面

colmap gui

点击Reconstruction > Automatic reconstruction

Workspace folder选择gerrard-hall,Image folder选择gerrard-hall/images,质量Quality选择Medium

其他默认,直接run就可以了


我的电脑是没有CUDA的,报了警告:Skipping patch match stereo because CUDA is not available.

看了官方的FAQ,不支持CUDA的GPU不可以使用密集重建,需要使用外部密集重建软件进行替代


安装稠密重建软件

浅试了一下用PMVS2,官方链接:https://www.di.ens.fr/pmvs/documentation.html

不知道是不是因为软件太老,很多动态链接库都下载不了

然后想尝试CMVS,发现VisualSFM集成了CMVS and PMVS,

不过也是比较老的了,2012年的,官方下载也是支持ubuntu12.04,官方链接:http://ccwu.me/vsfm/

需要下载和编译很多软件,官方也说是It’s really easy to use, but really hard to install.

感觉步骤多,比较旧bug多,费时不讨好,再找找其他的。


比较新的好像是openMVG(Open Multiple View Geometry)

另一个比较像的叫openMVS(open Multi-View Stereo reconstruction library)

我需要的应该是openMVS,但我走了弯路多安装了openMVG


安装openMVG

既然安装了openMVG,这里也记录一下安装过程,

参照BUILD.md 安装,官方链接:https://github.com/openMVG/openMVG/blob/develop/BUILD.md#linux

为了避免使用外部ceres,先将src下的CMakeLists.txt的find_package(Ceres QUIET HINTS ${CERES_DIR_HINTS})注释掉,使用内部的ceres

sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libxxf86vm1 libxxf86vm-dev libxi-dev libxrandr-dev
sudo apt-get install graphviz
git clone --recursive https://github.com/openMVG/openMVG.git
mkdir openMVG_Build && cd openMVG_Build
cmake -DCMAKE_BUILD_TYPE=RELEASE -DOpenMVG_BUILD_TESTS=ON ../openMVG/src/
sudo cmake --build . --target install
make test
ctest --output-on-failure -j

安装openMVS

官方链接:https://github.com/cdcseacave/openMVS

参照BUILD.md安装,一堆warning

# 先注意依赖要求
# (Eigen 3.4 or higher) (Opencv 2.4 or higher) (Ceres 1.10 or higher) 
# (CGAL 4.2 or higher) (Boost 1.56 or higher) (VCG) (GLFW)

sudo apt-get update
sudo apt-get -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev
# 我电脑里有eigen 3.3.7 实测也可行 这里不能瞎改版本 因为eigen版本是跟ceres版本绑定的
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
# 我电脑里有opencv4 编译不过 报错undefined reference to symbol 换成opencv3就搞定了
sudo apt-get -y install libcgal-dev libcgal-qt5-dev
git clone https://github.com/cdcseacave/VCG.git vcglib
# 我电脑里有ceres 2.1.0了所以略过 
sudo apt-get -y install freeglut3-dev libglew-dev libglfw3-dev

git clone https://github.com/cdcseacave/openMVS.git openMVS
main_path=`pwd`
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="$main_path/vcglib"
make -j2

sudo make install

三维重建

参考教程:https://blog.csdn.net/rdw1246010462/article/details/121044348


我使用的是gerrard-hall数据集,来自https://colmap.github.io/datasets.html

数据集自带了sparse文件夹,就不需要用colmap生成了

如果没有的话用colmap稀疏重建一下就行了,然后需要把对应的bin文件转为txt


由于openMVS只支持PINHOLE相机模型,我的数据集的相机模型是OpenCV,需要简单地近似一下

Colmap的相机模型可以参考:https://colmap.github.io/cameras.html#

PINHOLE相机模型为width height params[fx,fy,cx,cy]

OpenCV相机模型为width height params[fx,fy,cx,cy,k1,k2,k3,k4]

所以只需要打开camera.txt将OpenCV改成PINHOLE,并且把后四个数字删掉就可以近似了


以下是我的操作过程(很奇怪的是他的程序运行完内存不会释放,重启虚拟机才能释放)

openmvs_path=~/openMVS_build/bin #openmvs编译路径
cd ~/colmap_test/gerrard-hall #数据集路径
mkdir dense

# 格式转换
$openmvs_path/InterfaceCOLMAP -i . -o ./dense/colmap_model.mvs 

# 稠密重建 最终会生成ply
$openmvs_path/DensifyPointCloud -i ./dense/colmap_model.mvs -o ./dense/dense_model.mvs --archive-type -1

# 表面重建 最终会生成ply
$openmvs_path/ReconstructMesh -i ./dense/dense_model.mvs -o ./dense/dense_mesh_model.mvs 

# 网格精化 内存不够就把分辨率级别调小一点 数字越大级别越小 最终会生成ply
$openmvs_path/RefineMesh -i ./dense/dense_mesh_model.mvs -o ./dense/refine_dense_mesh_model.mvs --resolution-level 4

# 重开虚拟机一保证下个命令能运行完
# 纹理映射 需要挺大内存的 100张图片我虚拟机调成14G才能通过
$openmvs_path/TextureMesh -i ./dense/refine_dense_mesh_model.mvs -o ./dense/final_model.mvs

# 查看
$openmvs_path/Viewer ./dense/final_model.mvs